﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDevService.h"

namespace gcmp
{
    /// \brief DebugWarn处理接口
    ///
    /// 若没有通过SwitchTo接口进行切换， 则默认为Assert操作。
    /// 同时平台提供了Dialog样式的处理接口,
    /// 可通过 \see IDebugWarningDialogDisplayer::Create() 创建出来。
    class GCMP_DEV_SERVICE_EXPORT IDebugWarningDisplayer
    {
    public:
        /// \brief 触发警告时的显示接口
        ///
        ///  以下参数均为被触发警告的信息
        ///
        /// \param fileName 所在的文件名
        /// \param lineNumber 所在的行号
        /// \param functionName 所在的接口名称
        /// \param text  描述信息
        /// \param name  对应的Owner
        /// \param date  添加的日期
        /// \return bool false-代表后续此错误将忽略， true-表示后续错误不被忽略
        virtual bool Display(const std::string& fileName,
            int lineNumber,
            const std::string& functionName,
            const std::wstring& text,
            const std::wstring& name,
            const std::wstring& date) = 0;

        /// \brief 多线程下DebugWarn是否弹出Assert
        ///
        /// 平台默认的显示对象不支持多线程，多线程下Assert
        /// \return bool false-代表不弹出， true-代表弹出
        virtual bool ShouldAssertInMultithread() const = 0;

    public:
        /// \brief 获取当前的调试警告显示处理对象
        /// \return IDebugWarningDisplay* 当前的显示处理对象指针
        static IDebugWarningDisplayer* Get(); 

        /// \brief 切换当前的调试警告处理对象
        /// \param debugWarningDisplayer 待切换的处理对象
        /// \return bool true-切换成功, false-切换失败
        static bool SwitchTo(OwnerPtr<IDebugWarningDisplayer> debugWarningDisplayer);

        /// \brief 创建一个默认的Assert显示对象
        /// \return OwnerPtr<IDebugWarningDisplayer> 创建出来的新的Assert显示对象
        static OwnerPtr<IDebugWarningDisplayer> CreateAssertDisplayer();
    };
}

